Python 设计模式教程

1. 概述

设计模式是解决软件设计中常见问题的通用可重用解决方案。Python 作为一种灵活且强大的编程语言,支持多种设计模式。本教程将介绍几种常见的设计模式,并通过代码示例和实践练习帮助你理解和应用这些模式。

2. 设计模式简介

设计模式分为三大类:

  • 创建型模式:处理对象创建机制,试图以适当的方式来创建对象。
  • 结构型模式:处理对象组合或类组合,以形成更大的结构。
  • 行为型模式:处理对象之间的通信,特别是算法和职责分配。

3. 创建型模式

3.1 单例模式

单例模式确保一个类只有一个实例,并提供一个全局访问点。

代码示例:

class Singleton:
    _instance = None

    def __new__(cls, *args, **kwargs):
        if not cls._instance:
            cls._instance = super(Singleton, cls).__new__(cls, *args, **kwargs)
        return cls._instance

# 测试单例模式
s1 = Singleton()
s2 = Singleton()

print(s1 is s2)  # 输出: True

实践练习: 尝试创建一个单例类 Logger,用于记录日志信息。

3.2 工厂模式

工厂模式提供了一种创建对象的方式,而不需要指定具体的类。

代码示例:

class Dog:
    def speak(self):
        return "Woof!"

class Cat:
    def speak(self):
        return "Meow!"

class AnimalFactory:
    def get_animal(self, animal_type):
        if animal_type == "Dog":
            return Dog()
        elif animal_type == "Cat":
            return Cat()
        else:
            return None

# 测试工厂模式
factory = AnimalFactory()
dog = factory.get_animal("Dog")
print(dog.speak())  # 输出: Woof!

实践练习: 创建一个 ShapeFactory,根据输入创建不同的形状对象(如 Circle, Square)。

4. 结构型模式

4.1 适配器模式

适配器模式允许接口不兼容的类一起工作。

代码示例:

class OldSystem:
    def request(self):
        return "Old System Request"

class NewSystem:
    def specific_request(self):
        return "New System Request"

class Adapter(NewSystem):
    def request(self):
        return self.specific_request()

# 测试适配器模式
old_system = OldSystem()
new_system = Adapter()

print(old_system.request())  # 输出: Old System Request
print(new_system.request())  # 输出: New System Request

实践练习: 创建一个适配器,将一个旧的支付系统适配到新的支付接口。

4.2 装饰器模式

装饰器模式动态地给对象添加职责,而不改变其结构。

代码示例:

class Coffee:
    def cost(self):
        return 5

class MilkDecorator(Coffee):
    def __init__(self, coffee):
        self._coffee = coffee

    def cost(self):
        return self._coffee.cost() + 2

# 测试装饰器模式
coffee = Coffee()
milk_coffee = MilkDecorator(coffee)

print(coffee.cost())       # 输出: 5
print(milk_coffee.cost())  # 输出: 7

实践练习: 创建一个装饰器,用于给文本添加不同的样式(如加粗、斜体)。

5. 行为型模式

5.1 观察者模式

观察者模式定义了对象之间的一对多依赖关系,当一个对象改变状态时,所有依赖它的对象都会收到通知并自动更新。

代码示例:

class Subject:
    def __init__(self):
        self._observers = []

    def attach(self, observer):
        self._observers.append(observer)

    def detach(self, observer):
        self._observers.remove(observer)

    def notify(self):
        for observer in self._observers:
            observer.update(self)

class Observer:
    def update(self, subject):
        pass

class ConcreteObserver(Observer):
    def update(self, subject):
        print("Observer notified!")

# 测试观察者模式
subject = Subject()
observer = ConcreteObserver()

subject.attach(observer)
subject.notify()  # 输出: Observer notified!

实践练习: 创建一个观察者模式,用于监控股票价格的变化。

5.2 策略模式

策略模式定义了一系列算法,并将每个算法封装起来,使它们可以互换。

代码示例:

class Strategy:
    def execute(self):
        pass

class ConcreteStrategyA(Strategy):
    def execute(self):
        print("Executing Strategy A")

class ConcreteStrategyB(Strategy):
    def execute(self):
        print("Executing Strategy B")

class Context:
    def __init__(self, strategy):
        self._strategy = strategy

    def execute_strategy(self):
        self._strategy.execute()

# 测试策略模式
context = Context(ConcreteStrategyA())
context.execute_strategy()  # 输出: Executing Strategy A

context._strategy = ConcreteStrategyB()
context.execute_strategy()  # 输出: Executing Strategy B

实践练习: 创建一个策略模式,用于选择不同的排序算法(如冒泡排序、快速排序)。

6. 总结

本教程介绍了 Python 中几种常见的设计模式,并通过代码示例和实践练习帮助你理解和应用这些模式。设计模式是软件设计中的重要工具,掌握它们将有助于你编写更灵活、可维护的代码。

7. 进一步学习

  • 深入学习每种设计模式的变体和应用场景。
  • 探索其他设计模式,如代理模式、模板方法模式等。
  • 阅读《设计模式:可复用面向对象软件的基础》(Gang of Four)一书,了解更多设计模式的知识。

希望本教程对你有所帮助,祝你在 Python 编程和设计模式的学习中取得进步!